package com.mihuo.util;

import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

/**
 * JWT密钥生成工具类
 * 提供安全的密钥生成方法，确保符合JWT算法的安全要求
 * 
 * @author mihuo
 * @date 2025-09-27
 * @version 1.0
 */
public class JwtKeyGenerator {
    
    /**
     * 生成安全的HMAC-SHA256密钥（256位）
     * 适用于HS256、HS384、HS512算法
     * 
     * @return Base64编码的密钥字符串
     * @throws NoSuchAlgorithmException 算法不支持时抛出
     */
    public static String generateHS256Key() throws NoSuchAlgorithmException {
        KeyGenerator keyGen = KeyGenerator.getInstance("HmacSHA256");
        keyGen.init(256); // 设置密钥长度为256位
        SecretKey secretKey = keyGen.generateKey();
        return Base64.getEncoder().encodeToString(secretKey.getEncoded());
    }
    
    /**
     * 生成安全的HMAC-SHA512密钥（512位）
     * 专门用于HS512算法，满足其安全要求
     * 
     * @return Base64编码的密钥字符串
     * @throws NoSuchAlgorithmException 算法不支持时抛出
     */
    public static String generateHS512Key() throws NoSuchAlgorithmException {
        KeyGenerator keyGen = KeyGenerator.getInstance("HmacSHA512");
        keyGen.init(512); // HS512需要至少512位密钥
        SecretKey secretKey = keyGen.generateKey();
        return Base64.getEncoder().encodeToString(secretKey.getEncoded());
    }
    
    /**
     * 使用JJWT库的Keys类生成安全密钥（最简单的方式）
     * 
     * @return Base64编码的密钥字符串
     */
    public static String generateKeyWithJJWT() {
        SecretKey key = io.jsonwebtoken.security.Keys.secretKeyFor(
            io.jsonwebtoken.SignatureAlgorithm.HS512
        );
        return Base64.getEncoder().encodeToString(key.getEncoded());
    }
    
    /**
     * 测试密钥生成
     */
    public static void main(String[] args) {
        try {
            System.out.println("=== JWT密钥生成测试 ===");
            
            String hs256Key = generateHS256Key();
            System.out.println("HS256密钥 (" + (hs256Key.length() * 6) + "位): " + hs256Key);
            
            String hs512Key = generateHS512Key();
            System.out.println("HS512密钥 (" + (hs512Key.length() * 6) + "位): " + hs512Key);
            
            String jjwtKey = generateKeyWithJJWT();
            System.out.println("JJWT生成密钥: " + jjwtKey);
            
        } catch (Exception e) {
            System.err.println("密钥生成失败: " + e.getMessage());
        }
    }
}